package org.shj.basic.extendclass


abstract class Logger {
  //Logger中的属性想要让子类共享， 有以下两种方式
  //方式一： 定义变量及类型，但是不赋值
  val level: Level.Value 
  
  //方式二： 父类中的属性赋上一个值，子类中不需要再写这个属性了
  //val level: Level.Value = null
  
  def log(message: String) //没有实现体的方法都是抽象方法
}

object Level extends Enumeration{
  val DEBUG = Value("DEBUG")
  val INFO = Value("INFO")
  val WARN = Value("WARN")
}


class DebugLogger extends Logger{
  //方式一： 子类中必须同样定义此变量并且赋值，并要加上override
  override val level = Level.DEBUG
  
  //方式二： 父类中的属性赋上一个值，子类中不需要再写这个属性了
  
  def log(message: String){
    //println("this.level.id: " + this.level.id + "; Logger.currentLogLevel.id: " + Logger.currentLogLevel.id)
    if(this.level.id == Logger.currentLogLevel.id){
      println("[Debug]: " + message)
    }    
  }
}

class InfoLogger extends Logger{
  //方式一： 子类中必须同样定义此变量并且赋值，并要加上override
  override val level = Level.INFO
  
  //方式二： 父类中的属性赋上一个值，子类中不需要再写这个属性了
  
  def log(message: String){
    //println("this.level.id: " + this.level.id + "; Logger.currentLogLevel.id: " + Logger.currentLogLevel.id)
    if(Logger.currentLogLevel.id == Level.DEBUG.id || this.level.id == Logger.currentLogLevel.id ){
      println("[Info]: " + message)
    }    
  }
}

object Logger{
  val currentLogLevel = Level.INFO
  
  def main(args: Array[String]): Unit = {
    val debug = new DebugLogger
    debug.log("Won't print")
    
    val info = new InfoLogger
    info.log("I'm info level message")
  }
}